/**
 * 表格综合示例(可编辑表格)
 *
 * @author XiongChun
 * @since 2010-10-20
 */
Ext.onReady(function(){
    var delArray = [];
	var goodStore = new Ext.data.Store({
						proxy : new Ext.data.HttpProxy({
									url : 'order.ered?reqCode=queryGoods'
								}),
						reader : new Ext.data.JsonReader({}, [{
											name : 'value'
										}, {
											name : 'text'
										}]),
						baseParams : {
							//areacode : '53'
						},
						listeners : {
							// 设置远程数据源下拉选择框的初始值
							'load' : function(obj) {
								//areaCombo.setValue('530101');
							}
						}
					});

			goodStore.load(); // 如果mode : 'local',时候才需要手动load();
	var goodCombo = new Ext.form.ComboBox({
				hiddenName : 'good',
				fieldLabel : '选择道具',
				emptyText : '请选择...',
				triggerAction : 'all',
				store : goodStore,
				displayField : 'text',
				valueField : 'value',
				loadingText : '正在加载数据...',
				mode : 'local', // 数据会自动读取,如果设置为local又调用了store.load()则会读取2次；也可以将其设置为local，然后通过store.load()方法来读取
				allowBlank : true,
				forceSelection : false,
				editable : true,
				typeAhead : true,
				plugins:[new QM.plugin.PinyinFilter],
				// value : '530101',
				anchor : '100%'
					// 设置远程数据源下拉选择框的初始值(此延时方法不好，使用上面的监听areaStore的load事件的方法)
					/*
					 * listeners : { 'render' : function(obj) {
					 * areaStore.load(); window.setTimeout(function() {
					 * obj.setValue('530101'); }, 200) } }
					 */
				});
    /**
     * 录入页面
     */
    var myForm = new Ext.form.FormPanel({
        region: 'north',
        title: '<span class="commoncss">订单信息<span>',
        collapsible: true,
        border: true,
        labelWidth: 60, // 标签宽度
        //frame : true, //是否渲染表单面板背景色
        labelAlign: 'right', // 标签对齐方式
        bodyStyle: 'padding:5 5 0', // 表单元素和表单面板的边距
        buttonAlign: 'center',
        height: 120,
        items: [{
            layout: 'column',
            border: false,
            items: [{
                columnWidth: .50,
                layout: 'form',
                labelWidth: 60, // 标签宽度
                defaultType: 'textfield',
                border: false,
                items: [{
                    fieldLabel: '订单编号',
                    name: 'ordernos',
					id:'ordernos',
                    maxLength: 30,
                    readOnly: true,
                    emptyText: '单号自动生成',
                    anchor: '100%'
                }, {
                    fieldLabel: '下单原因',
                    name: 'orderre',
                    xtype: 'textarea',
                    maxLength: 100,
                    anchor: '100%'
                }]
            }, {
                columnWidth: .50,
                layout: 'form',
                //labelWidth: 60, // 标签宽度
                defaultType: 'textfield',
                border: false,
                items: [{
                    fieldLabel: '下单学校', // 标签
                    name: 'orders', // name:后台根据此name属性取值
                    maxLength: 20, // 可输入的最大文本长度,不区分中英文字符
                    readOnly: true,
                    anchor: '100%'// 宽度百分比
                }, {
                    fieldLabel: '驳回理由',
                    xtype: 'textarea',
                    maxLength: 100,
                    anchor: '100%'
                }]
            }]
        }]
    });
    
    // 定义自动当前页行号
    var rownum2 = new Ext.grid.RowNumberer({
        header: 'NO',
        width: 28
    });
	
	//选中时间联动
		goodCombo.on('select', function() {
		// 提交到后台处理
	        Ext.Ajax.request({
	            url: 'order.ered?reqCode=queryGood',
	            success: function(response){ // 回调函数有1个参数
	            var resultArray = Ext.util.JSON.decode(response.responseText);
				var sm = grid2.getSelectionModel();
				//alert(sm);
			    var cell = sm.getSelectedCell();
			    if (Ext.isEmpty(cell)) {
			        Ext.Msg.alert('提示', '你没有选中行');
			    }
				var record = store2.getAt(cell[0]);
				record.set('goodname', resultArray['goodname'])
				record.set('goodunit', resultArray['goodunit'])
				record.set('goodprice', resultArray['price'])
				record.set('gooddis', resultArray['discount'])
	            },
	            failure: function(response){
	                Ext.MessageBox.alert('提示', '物品数据不存在');
	            },
	            params: {
	                // 系列化为Json资料格式传入后台处理
	                goodnos: this.getValue()
	            }
	        });
		});
    
    // 定义列模型
    var cm2 = new Ext.grid.ColumnModel([rownum2, {
        header: '明细单号', // 列标题
        dataIndex: 'detailno', // 数据索引:和Store模型对应
        emptyMsg: '自动生成',
        sortable: true
        // 是否可排序
    }, {
        header: '商品号',
        dataIndex: 'goodno',
        sortable: true,
		editor:goodCombo,
	
    }, {
        header: '商品名称',
        dataIndex: 'goodname',
    }, {
        header: '商品单位',
		dataIndex: 'goodunit',
        renderer : UNITRender,
		editor : new Ext.grid.GridEditor(new Ext.form.ComboBox({
					store : UNITStore,
					mode : 'local',
					triggerAction : 'all',
					valueField : 'value',
					displayField : 'text',
					allowBlank : false,
					forceSelection : true,
					typeAhead : true
				})),
		width : 60
    }, {
        header: '商品单价',
        dataIndex: 'goodprice',
		emptyText: '0',
        width: 60
    }, {
        header: '商品折扣',
        dataIndex: 'gooddis',
        width: 60
    }, {
        header: '下单数量',
        dataIndex: 'ordernum',
		emptyMsg:'1',
		enableKeyEvents : true,
		
        editor: new Ext.grid.GridEditor(new Ext.form.NumberField({
            // 只对原有数据编辑有效,对新增一行的场景无效
			//emptyText: 0,
            maxValue: 100000,
			minValue : 1,
            decimalPrecision: 0,// 小数精度
            allowBlank: false,
			listeners : {
				blur: function(field, e) {
				var sm = grid2.getSelectionModel();
				//alert(sm);
			    var cell = sm.getSelectedCell();
			    if (Ext.isEmpty(cell)) {
			        Ext.Msg.alert('提示', '你没有选中行');
			    }
				var record = store2.getAt(cell[0]);
				var price = record.get('goodprice');
				var dis = record.get('gooddis');
				record.set('totalprice', field.getValue() * price *dis);
				//alert(field.getValue() * price);
				countAll();
				}
			},
        })),
        width: 60
    },{
		header: '合计',
        dataIndex: 'totalprice',
        width: 60
	}
    ]);
    
    /**
     * 数据存储
     */
    var store2 = new Ext.data.Store({
        pruneModifiedRecords: true,
        // 获取数据的方式
        proxy: new Ext.data.HttpProxy({
            url: 'order.ered?reqCode=queryDetail'
        }),
        // 数据读取器
        reader: new Ext.data.JsonReader({
            totalProperty: 'TOTALCOUNT', // 记录总数
            root: 'ROOT' // Json中的列表数据根节点
        }, [{
            name: 'detailno' // Json中的属性Key值
        },{
            name: 'goodname' // Json中的属性Key值
        },{
            name: 'goodunit' // Json中的属性Key值
        },{
            name: 'goodprice' // Json中的属性Key值
        },{
            name: 'gooddis' // Json中的属性Key值
        }, {
            name: 'ordernum'
        }, {
            name: 'goodno'
        },{
            name: 'totalprice'
        }])
    });
    
    // 定义一个Record
    var MyRecord = Ext.data.Record.create([
	{
        name: 'detailno',
        type: 'string'
    }, {
        name: 'goodno',
        type: 'string'
    },{
        name: 'goodname',
        type: 'string'
    },{
        name: 'goodunit',
        type: 'string'
    },{
        name: 'price',
        type: 'double'
    },{
        name: 'discount',
        type: 'double'
    }, {
        name: 'ordernum',
        type: 'int'
    },{
        name: 'totalprice',
        type: 'int'
    }]);
    
    
    // 表格工具栏
    var tbar2 = new Ext.Toolbar({
        items: [{
			text:'',
            xtype: 'button',
            //id: 'totalmoney',
           // name: 'totalmoney',
			handleMouseEvents :false,
			readOnly:true,
            width: 270,
        }, '-', {
            text: '新增一行',
            iconCls: 'addIcon',
            handler: function(){
                var row = new MyRecord({});
                row.set('goodprice', 0); // 赋初值
                row.set('detailno', '自动生成'); // 赋初值
                row.set('gooddis',1);
                row.set('totalprice',0);
                grid2.stopEditing();
                store2.insert(0, row);
                grid2.startEditing(0, 2);
            }
        }, {
            text: '删除一行',
            iconCls: 'deleteIcon',
            handler: function(){
                var sm = grid2.getSelectionModel();
                var cell = sm.getSelectedCell();
                if (Ext.isEmpty(cell)) {
                    Ext.Msg.alert('提示', '你没有选中行');
                }
                var record = store2.getAt(cell[0]);
                //删除的订单号放入array
                if(''!= record.get('detailno') && '自动生成' != record.get('detailno')){
                    delArray.push(record.get('detailno'));
                }
                
                store2.remove(record);
            }
        }, {
            text: '保存',
            iconCls: 'acceptIcon',
            handler: function(){
                saveRow();
            }
        },'-',{
			text:'合计',
            xtype: 'button',
            id: 'totalmoney',
            name: 'totalmoney',
			handleMouseEvents :false,
            emptyText: '订单合计数量',
			readOnly:true,
            width: 150,
        }]
    });
    
    // 表格实例
    var grid2 = new Ext.grid.EditorGridPanel({
        // 表格面板标题,默认为粗体，我不喜欢粗体，这里设置样式将其格式为正常字体
        title: '<span class="commoncss">订单明细</span>',
        height: 500,
        id: 'id_grid_sfxm',
        autoScroll: true,
        frame: true,
        region: 'center', // 和VIEWPORT布局模型对应，充当center区域布局
        store: store2, // 数据存储
        //stripeRows : true, // 斑马线
        cm: cm2, // 列模型
        tbar: tbar2, // 表格工具栏
        //bbar : bbar2,// 分页工具栏 
        clicksToEdit: 1, // 单击、双击进入编辑状态
        //items:[myForm],
        viewConfig: {
            // 不产横向生滚动条, 各列自动扩展自动压缩, 适用于列数比较少的情况
            forceFit: false
        },
        loadMask: {
            msg: '正在加载表格数据,请稍等...'
        }
    });
    
    
    // 页面初始自动查询数据
    //store2.load();
    
    // 布局模型
    var viewport = new Ext.Viewport({
        layout: 'border',
        items: [myForm, grid2]
    });
    
    // 查询表格数据
    function queryCatalogItem(){
        store2.load({
            params: {
                start: 0,
                //limit : bbar2.pageSize,
                orderno: Ext.getCmp('ordernos').getValue()
            }
        });
    }
	
	//合计金额
	function countAll(){
		 var m = store2.sum('totalprice');
		 //alert(m);
		 Ext.getCmp('totalmoney').setText('合计：'+m);
	}
	
	
    
    // 保存
    function saveRow(){
       // Ext.MessageBox.alert(Ext.encode(delArray));
        //return ;
        var m = store2.modified.slice(0); // 获取修改过的record数组对象
        if (Ext.isEmpty(m) && Ext.isEmpty(delArray)) {
            Ext.MessageBox.alert('提示', '没有数据需要保存!');
           return;
        }
        if (!validateEditGrid(m, 'goodno')) {
            Ext.Msg.alert('提示', '商品号名称字段数据校验不合法,请重新输入!', function(){
                grid2.startEditing(0, 2);
            });
            return;
        }
        if (!validateEditGrid(m, 'ordernum')) {
                    Ext.Msg.alert('提示', '订单数量不合法,请重新输入!', function() {
                                grid.startEditing(0, 7);
                            });
                    return;
                }
        var jsonArray = [];
        // 将record数组对象转换为简单Json数组对象
        Ext.each(m, function(item){
            jsonArray.push(item.data);
        });
        // 提交到后台处理
        Ext.Ajax.request({
            url: 'order.ered?reqCode=saveOrder',
            success: function(response){ // 回调函数有1个参数
                var resultArray = Ext.util.JSON.decode(response.responseText);
				Ext.getCmp('ordernos').setValue(resultArray['ordernos']);
                Ext.Msg.alert('提示', resultArray['result']);
				queryCatalogItem();
            },
            failure: function(response){
                Ext.MessageBox.alert('提示', '数据保存失败');
            },
            params: {
                deldata : Ext.encode(delArray),
                // 系列化为Json资料格式传入后台处理
                detailData: Ext.encode(jsonArray)
            }
        });
    }
    
    // 检查新增行的可编辑单元格数据合法性
    function validateEditGrid(m, colName){
        for (var i = 0; i < m.length; i++) {
            var record = m[i];
            var rowIndex = store2.indexOfId(record.id);
            var value = record.get(colName);
            if (Ext.isEmpty(value)) {
                // Ext.Msg.alert('提示', '数据校验不合法');
                return false;
            }
            var colIndex = cm2.findColumnIndex(colName);
            var editor = cm2.getCellEditor(colIndex).field;
            if (!editor.validateValue(value)) {
                // Ext.Msg.alert('提示', '数据校验不合法');
                return false;
            }
        }
        return true;
    }
    
    // 表单加载数据的回调函数
    function loadCallBack(){
        firstForm.form.load({
            waitMsg: '正在读取信息',// 提示信息
            waitTitle: '提示',// 标题
            url: 'formDemo.ered?reqCode=loadCallBack',// 请求的url地址
            // method : 'GET',// 请求方式
            success: function(form, action){// 加载成功的处理函数
                Ext.Msg.alert('提示', '数据读取成功');
            },
            failure: function(form, action){// 加载失败的处理函数
                Ext.Msg.alert('提示', '数据读取失败:' + action.failureType);
            }
        });
    }
    
});
